package com.itheima.controller.request;

import com.itheima.domain.Card;
import com.itheima.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Arrays;
import java.util.List;

/**
 * https://docs.spring.io/spring-framework/docs/5.3.19-SNAPSHOT/reference/html/web.html#mvc-ann-arguments
 * 学习目标：掌握Controller类方法中常见的参数书写
 * 1.@RequestParam: 获取url后面参数
 * 2.@RequestParam: 给参数列表的参数赋默认值
 */
@Controller
public class RequestParamController {

    /**
     * @TODO 需求1.springmvc如何从url中获取传递的从参数？
     * 例如：http://localhost:8080/params1?age=18&name=tom&lock=true
     * 例如：http://localhost:8080/params1?age=18&myName=tom&lock=true  (传递的参数和方法参数列表中参数名不一致)
     * 使用场景：@RequestParam获取url后面参数。
     * 规则：如果url后面参数名称和请求方法列表中参数名称相同，可以省略@RequestParam;反之，必须加上该注解。
     */
    @RequestMapping("/params1")
    public String params1(@RequestParam Integer age, @RequestParam("myName") String name, Boolean lock) {
        System.out.println("age==>" + age + ",name==>" + name + ",lock===>" + lock);
        return "success";
    }

    /**
     * 独立思考：@RequestParam注解可以赋默认值
     * 例如：http://localhost:8080/params2分页查询，前端不传递pageNum和pageSize,默认pageNum=1，pageSize=10
     */
    @RequestMapping("/params2")
    public String params2(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) {
        System.out.println("pageNum=" + pageNum + " <=====>  pageSize=" + pageSize);
        return "success";
    }

    /**
     * @TODO 需求2.当url中传递的参数过多，如果都在方法列表中声明参数来接收，这样代码不够简洁，这个时候该如何解决呢？
     * 可以在参数列表中定义一个实体对象类封装所有的参数，注意对象成员变量名称要和参数要一致
     */
    @RequestMapping("/user")
    public String user(User user) {
        System.out.println("user = " + user);
        return "success";
    }

    /**
     * 独立思考：
     * 如果方法参数列表中使用的包装对象，该如何传递参数呢？
     */
    @RequestMapping("/card")
    public String card(Card card) {
        System.out.println("card = " + card);
        return "success";
    }

    /**
     * @TODO 需求3.当url中传递的多个参数的参数名相同，如何使用数组来接收呢?
     * http://localhost:8080/array?arrs=tom&arrs=jack
     */
    @RequestMapping("/array")
    public String array(String[] arrs) {
        List<String> list = Arrays.asList(arrs);
        System.out.println("list = " + list);
        return "success";
    }

    //http://localhost:8080/array?list=tom&list=jack
    @RequestMapping("/list")
    public String list(@RequestParam List<String> list) {
        System.out.println("list = " + list);
        return "success";
    }

    /**
     * @TODO 需求4.当前端页面传递birthDay="2022-01-01 01:01:01"字符串类型日期，方法列表中实体对象中有一个Date类型字段，该如何转换呢？
     */
    @RequestMapping("/date")
    public String date(User user) {
        System.out.println("user = " + user);
        return "success";
    }
}
